package com.c2b.algorithm.leetcode.base;

/**
 * <a href="https://leetcode.cn/problems/delete-the-middle-node-of-a-linked-list/">删除链表的中间节点(Delete the Middle Node of a Linked List)</a>
 * <p>给你一个链表的头节点 head 。删除 链表的 中间节点 ，并返回修改后的链表的头节点 head 。</p>
 * <p>长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点（下标从 0 开始），其中 ⌊x⌋ 表示小于或等于 x 的最大整数。</p>
 * <p>  对于 n = 1、2、3、4 和 5 的情况，中间节点的下标分别是 0、1、1、2 和 2 。</p>
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *
 *      输入：head = [1,3,4,<a color='red'>7</a>,1,2,6]
 *      输出：[1,3,4,1,2,6]
 *      解释：
 *          由于 n = 7 ，值为 7 的节点 3 是中间节点。
 *          返回结果为移除节点后的新链表。
 *
 * 示例 2：
 *
 *      输入：head = [1,2,<a color='red'>3</a>,4]
 *      输出：[1,2,4]
 *      解释：
 *          对于 n = 4 ，值为 3 的节点 2 是中间节点。
 *
 * 示例 3：
 *
 *      输入：head = [2,<a color='red'>1</a>]
 *      输出：[2]
 *      解释：
 *          对于 n = 2 ，值为 1 的节点 1 是中间节点。
 *          值为 2 的节点 0 是移除节点 1 后剩下的唯一一个节点。
 * </pre>
 * </p>
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>链表中节点的数目在范围 [1, 10^5] 内</li>
 *     <li>1 <= Node.val <= 10^5</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/11/13 13:45
 */
public class LC2095DeleteTheMiddleNodeOfLinkedList_M {

    static class Solution {
        public ListNode deleteMiddle(ListNode head) {
            if (head == null) {
                return null;
            }
            ListNode dummyHead = new ListNode(-1, head);
            ListNode prevNode = dummyHead;
            ListNode slowNode = dummyHead;
            ListNode fastNode = dummyHead;
            while (fastNode != null && fastNode.next != null) {
                prevNode = slowNode;
                slowNode = slowNode.next;
                fastNode = fastNode.next.next;
            }
            prevNode.next = slowNode.next;
            return dummyHead.next;
        }
    }

    public static void main(String[] args) {
        ListNode head1 = new ListNode(1);
        head1.next = new ListNode(3);
        head1.next.next = new ListNode(4);
        head1.next.next.next = new ListNode(7);
        head1.next.next.next.next = new ListNode(1);
        head1.next.next.next.next.next = new ListNode(2);
        head1.next.next.next.next.next.next = new ListNode(6);

        ListNode head2 = new ListNode(1);
        head2.next = new ListNode(2);
        head2.next.next = new ListNode(3);
        head2.next.next.next = new ListNode(4);

        ListNode head3 = new ListNode(2);
        head3.next = new ListNode(1);

        ListNode head4 = new ListNode(2);

        Solution solution = new Solution();
        Printer.printListNode(solution.deleteMiddle(head1));
        Printer.printListNode(solution.deleteMiddle(head2));
        Printer.printListNode(solution.deleteMiddle(head3));
        Printer.printListNode(solution.deleteMiddle(head4));
    }
}
